/**
 * Create in 2012-4-8.
 */
package kit4j.util.image;

import java.awt.Component;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.ImageObserver;

/**
 * Image图像工具。
 * 
 * @author MiniKnife
 * 
 */
public class ImageUtil {

	/**
	 * 等待指定的图像加载完成。
	 * 
	 * @param component
	 *            将要使用图像的组件
	 * @param img
	 *            等待加载的图像
	 */
	public static void waitForImageLoading(Component component, Image img) {
		MediaTracker mediaTracker = new MediaTracker(component);

		mediaTracker.addImage(img, 0);

		waitForAllImagesFromMediaTracker(mediaTracker);
	}

	/**
	 * 等待指定的图像加载完成。
	 * 
	 * @param component
	 *            将要使用图像的组件
	 * @param imgs
	 *            等待加载的图像
	 */
	public static void waitForImagesLoading(Component component, Image... imgs) {
		MediaTracker mediaTracker = new MediaTracker(component);

		for (int i = 0; i < imgs.length; ++i) {
			mediaTracker.addImage(imgs[i], i);
		}

		waitForAllImagesFromMediaTracker(mediaTracker);
	}

	/**
	 * 等待MediaTracker对象持有的所有的图像加载完成。
	 * 
	 * @param mediaTracker
	 *            MediaTracker对象
	 */
	private static void waitForAllImagesFromMediaTracker(MediaTracker mediaTracker) {
		try {
			mediaTracker.waitForAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建此图像的缩放版本。
	 * 
	 * @param img
	 *            要缩放的图像
	 * @param width
	 *            要缩放到的宽度
	 * @param height
	 *            要缩放到的高度
	 * @param hints
	 *            指示用于图像重新取样的算法类型的标志
	 * @return 图像的缩放版本。
	 * @throws IllegalArgumentException
	 *             如果 width 或 height 为零。
	 */
	public static Image scale(Image img, int width, int height, int hints) throws IllegalArgumentException {
		return img.getScaledInstance(width, height, hints);
	}

	/**
	 * 创建此图像的缩放版本。
	 * 
	 * @param img
	 *            要缩放的图像
	 * @param per
	 *            图像的缩放比例
	 * @param hints
	 *            指示用于图像重新取样的算法类型的标志
	 * @param observer
	 *            等待加载图像的对象
	 * @return 图像的缩放版本。
	 * @throws IllegalArgumentException
	 *             如果per为零。
	 */
	public static Image scale(Image img, float per, int hints, ImageObserver observer) throws IllegalArgumentException {
		return scale(img, (int) (img.getWidth(observer) * per), (int) (img.getHeight(observer) * per), hints);
	}
}
